#include <iostream>
#include <vector>


void recursion(std::vector<std::vector<int>>&res,
    std::vector<int>&nums,
    std::vector<bool>&used,
    std::vector<int>&v
)
{
    // 还有大数加法,滑动窗口,信号塔？？？？？
    // 严格来讲我其实并不太那么需要反思的一个人
    // 怎么来控制递归次数，是指今日你还是不会？？？？
    // 那递归你是怎么算学会的????
    if (nums.size() == v.size())
    {
        res.push_back(v);
        return ;            // 递归携带参数，不能用引用，不然就只有一个结果
    }

    int n = nums.size();
    for (int i =0;i < n;i++)
    {
        if (used[i] == false)
        {
            v.push_back(nums[i]);
            used[i] =true;
            recursion(res,nums,used,v);
            v.pop_back();
            used[i] = false ;
        }
    }
}

// 我认为引用是一种十分高级的语法
// 旋转数组问题如何使用C++来进行实现
// 使用std::vector<>容器的迭代器进行倒序？？？？


void nuneul_kama(
    std::vector<bool>&used,
    const std::vector<int>&nums,
    std::vector<std::vector<int>>&res,
    std::vector<int>&temp
)
{
    // 其实我发现如果一个递归问题一上来就写递归终止条件的话貌似有点让人头疼
    // 对于递归问题我们应该逻辑清晰一些，
    // 递归是将一个整体的，较大的问题拆解成许多个问题进行
    // 那么我们应该先有了每一步的操作之后最好再写理应先进行的终止条件
    if (temp.size() == nums.size())
    {
        res.push_back(temp);
        return ;    // 其实我认为，我应该再去看看交换两个数字的做法，其实大同小异都是这些东西
    }

    for (int i = 0;i < nums.size();i++)
    {
        if (used[i] == false)
        {
            temp.push_back(nums[i]);
            used[i] = true;
            nuneul_kama(used,nums,res,temp);
            temp.pop_back();
            used[i] = false;
        }
    }
}

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);

    std::vector<int>nums = {1,2,3};
    std::vector<std::vector<int>>res;

    int n = nums.size();
    std::vector<bool>used(n,false);
    std::vector<int>temp;

    nuneul_kama(used,nums,res,temp) ;

    for (auto vec :res)
    {
        for (int i : vec)
        {
            std::cout<<i<<" ";
        }
        std::cout<<"\n";
    }

    int* arr = new int[](5);
    // 事实证明还是不会。。。。。

    return 0;
}